package main

import "fmt"

func main() {
	a := 10
	str := "abc"

	// 匿名函数: 没有函数名字
	f1 := func() { // 用一个变量来接这个匿名函数 这里的变量和匿名函数就形成一个闭包 是一个函数定义
		fmt.Println("a = ", a)
		fmt.Println("str = ", str)
	}

	// 调用函数
	f1()

	// 给一个函数类型起名
	type FuncType func() // 函数没有参数 没有返回值
	var f2 FuncType
	f2 = f1
	// 调用函数
	f2()


	// 定义匿名函数并同时调用
	func() {
		fmt.Printf("a = %d, str = %s\n", a, str)
	}() // () 代表该匿名函数被调用


	// 带参数的匿名函数
	func(i, j int) {
		fmt.Printf("i = %d, j = %d\n", i, j)
	}(10, 4)


	// 带参数和有返回值的匿名函数
	x, y := func(i, j int) (max, min int) {
		if i > j {
			max = i
			min = j
		} else {
			max = j
			min = i
		}
		return // 有返回值的函数一定要记得 return
	}(10, 49)

	fmt.Printf("x = %d, y = %d\n", x, y)

}
